home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / gtlayout-source.lha / LT_LockWindow.c < prev    next >
C/C++ Source or Header  |  1995-09-24  |  3KB  |  180 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1995 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. VOID LIBENT
  10. LT_LockWindow(REG(a0) struct Window *window)
  11. {
  12.     if(window)
  13.     {
  14.         LockNode    *lockNode;
  15.         BOOLEAN      found;
  16.  
  17.         found = FALSE;
  18.  
  19.         ObtainSemaphore(<P_LockSemaphore);
  20.  
  21.         SCANLIST(<P_LockList,lockNode)
  22.         {
  23.             if(lockNode -> Window == window)
  24.             {
  25.                 lockNode -> Count++;
  26.  
  27.                 found = TRUE;
  28.  
  29.                 break;
  30.             }
  31.         }
  32.  
  33.         if(!found)
  34.         {
  35.             if(lockNode = AllocMem(sizeof(LockNode),MEMF_PUBLIC | MEMF_ANY | MEMF_CLEAR))
  36.             {
  37.                 AddTail((struct List *)<P_LockList,(struct Node *)lockNode);
  38.  
  39.                 lockNode -> Window        = window;
  40.                 lockNode -> OldIDCMPFlags    = window -> IDCMPFlags;
  41.                 lockNode -> Count        = 1;
  42.                 lockNode -> MinWidth        = window -> MinWidth;
  43.                 lockNode -> MaxWidth        = window -> MaxWidth;
  44.                 lockNode -> MinHeight        = window -> MinHeight;
  45.                 lockNode -> MaxHeight        = window -> MaxHeight;
  46.  
  47.                 WindowLimits(window,window -> Width,window -> Height,window -> Width,window -> Height);
  48.  
  49.                 ModifyIDCMP(window,(window -> IDCMPFlags & IDCMP_REFRESHWINDOW) | IDCMP_SIZEVERIFY);
  50.  
  51.                 if(V39)
  52.                 {
  53.                     STATIC struct TagItem tags[3] =
  54.                     {
  55.                         WA_BusyPointer,        TRUE,
  56.                         WA_PointerDelay,    TRUE,
  57.  
  58.                         TAG_DONE
  59.                     };
  60.  
  61.                     SetWindowPointerA(window,tags);
  62.                 }
  63.                 else
  64.                 {
  65.                     STATIC UWORD __chip Stopwatch[(2 + 16) * 2] =
  66.                     {
  67.                         0x0000,0x0000,
  68.  
  69.                         0x0400,0x07C0,
  70.                         0x0000,0x07C0,
  71.                         0x0100,0x0380,
  72.                         0x0000,0x07E0,
  73.                         0x07C0,0x1FF8,
  74.                         0x1FF0,0x3FEC,
  75.                         0x3FF8,0x7FDE,
  76.                         0x3FF8,0x7FBE,
  77.                         0x7FFC,0xFF7F,
  78.                         0x7EFC,0xFFFF,
  79.                         0x7FFC,0xFFFF,
  80.                         0x3FF8,0x7FFE,
  81.                         0x3FF8,0x7FFE,
  82.                         0x1FF0,0x3FFC,
  83.                         0x07C0,0x1FF8,
  84.                         0x0000,0x07E0,
  85.  
  86.                         0x0000,0x0000
  87.                     };
  88.  
  89.                     SetPointer(window,Stopwatch,16,16,-6,0);
  90.                 }
  91.  
  92.                 Request(&lockNode -> Requester,window);
  93.             }
  94.         }
  95.  
  96.         ReleaseSemaphore(<P_LockSemaphore);
  97.     }
  98. }
  99.  
  100.  
  101. /****************************************************************************/
  102.  
  103.  
  104. VOID LIBENT
  105. LT_UnlockWindow(REG(a0) struct Window *window)
  106. {
  107.     if(window)
  108.     {
  109.         LockNode *lockNode;
  110.  
  111.         ObtainSemaphore(<P_LockSemaphore);
  112.  
  113.         SCANLIST(<P_LockList,lockNode)
  114.         {
  115.             if(lockNode -> Window == window)
  116.             {
  117.                 if(--lockNode -> Count < 1)
  118.                 {
  119.                     Remove((struct Node *)lockNode);
  120.  
  121.                     WindowLimits(window,lockNode -> MinWidth,lockNode -> MinHeight,lockNode -> MaxWidth,lockNode -> MaxHeight);
  122.  
  123.                     EndRequest(&lockNode -> Requester,window);
  124.  
  125.                     if(V39)
  126.                         SetWindowPointerA(window,NULL);
  127.                     else
  128.                         ClearPointer(window);
  129.  
  130.                     ModifyIDCMP(window,lockNode -> OldIDCMPFlags);
  131.  
  132.                     FreeMem(lockNode,sizeof(LockNode));
  133.                 }
  134.  
  135.                 break;
  136.             }
  137.         }
  138.  
  139.         ReleaseSemaphore(<P_LockSemaphore);
  140.     }
  141. }
  142.  
  143.  
  144. /*****************************************************************************/
  145.  
  146.  
  147. VOID LIBENT
  148. LT_DeleteWindowLock(REG(a0) struct Window *window)
  149. {
  150.     if(window)
  151.     {
  152.         LockNode *lockNode;
  153.  
  154.         ObtainSemaphore(<P_LockSemaphore);
  155.  
  156.         SCANLIST(<P_LockList,lockNode)
  157.         {
  158.             if(lockNode -> Window == window)
  159.             {
  160.                 Remove((struct Node *)lockNode);
  161.  
  162.                 EndRequest(&lockNode -> Requester,window);
  163.  
  164.                 if(V39)
  165.                     SetWindowPointerA(window,NULL);
  166.                 else
  167.                     ClearPointer(window);
  168.  
  169.                 ModifyIDCMP(window,lockNode -> OldIDCMPFlags);
  170.  
  171.                 FreeMem(lockNode,sizeof(LockNode));
  172.  
  173.                 break;
  174.             }
  175.         }
  176.  
  177.         ReleaseSemaphore(<P_LockSemaphore);
  178.     }
  179. }
  180.